home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-08-16 | 12.9 KB | 431 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: Content.cpp
- // Release Version: $ ODF 1 $
- //
- // Author: Mary Boetcher
- //
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "Bitmap.hpp"
-
- #ifndef CONTENT_H
- #include "Content.h"
- #endif
-
- #ifndef PART_H
- #include "Part.h"
- #endif
-
- #ifndef SELECT_H
- #include "Select.h"
- #endif
-
- // ----- Part Layer -----
-
- #ifndef FWUTIL_H
- #include "FWUtil.h"
- #endif
-
- // ----- OS Layer -----
-
- #ifndef FWODMISC_H
- #include "FWODMisc.h"
- #endif
-
- #ifndef FWPICTUR_H
- #include "FWPictur.h"
- #endif
-
- #ifndef FWBARRAY_H
- #include "FWBArray.h"
- #endif
-
- #ifndef FWFILEAC_H
- #include "FWFileAc.h"
- #endif
-
- #ifndef SLMixOS_H
- #include "SLMixOS.h"
- #endif
-
- #ifndef FWFILESY_H
- #include "FWFileSy.h"
- #endif
-
- #ifndef FWFILREP_H
- #include "FWFilRep.h"
- #endif
-
- // ----- Foundation Layer -----
-
- #ifndef FWSTREAM_H
- #include "FWStream.h"
- #endif
-
- #ifndef FWMEMORY_H
- #include "FWMemory.h"
- #endif
-
- // ----- OpenDoc Includes -----
-
- #ifndef SOM_Module_OpenDoc_StdProps_defined
- #include <StdProps.xh>
- #endif
-
- #ifndef SOM_ODTranslation_xh
- #include <Translt.xh>
- #endif
-
- #ifndef SOM_ODSession_xh
- #include <ODSessn.xh>
- #endif
-
- //========================================================================================
- // Runtime Information
- //========================================================================================
-
- #ifdef FW_BUILD_MAC
- #pragma segment odfbitmap
- #endif
-
- //========================================================================================
- // class CBitmapContent
- //========================================================================================
-
- FW_DEFINE_AUTO(CBitmapContent)
-
- //----------------------------------------------------------------------------------------
- // CBitmapContent::CBitmapContent
- //----------------------------------------------------------------------------------------
- // CBitmapContent constructor
-
- CBitmapContent::CBitmapContent(Environment* ev, CBitmapPart* part) :
- FW_CContent(ev, part),
- fBitmapPart(part)
- {
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapContent::~CBitmapContent
- //----------------------------------------------------------------------------------------
- // CBitmapContent destructor
-
- CBitmapContent::~CBitmapContent()
- {
- FW_START_DESTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapContent::GetBitmap
- //----------------------------------------------------------------------------------------
-
- FW_CBitmap CBitmapContent::GetBitmap(Environment* ev) const
- {
- if ((const void*)fBitmap == NULL)
- {
- // ----- Fool the compiler -----
- CBitmapContent* self = (CBitmapContent*)this;
- self->UseDefaultBitmap(ev);
- }
-
- return fBitmap;
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapContent::UseDefaultBitmap
- //----------------------------------------------------------------------------------------
- void CBitmapContent::UseDefaultBitmap(Environment* ev)
- {
- FW_CSharedLibraryResourceFile resFile(ev);
-
- #ifdef FW_BUILD_MAC
- FW_CPicture picture(resFile, 2128);
- fBitmap = FW_CBitmap(picture);
- #endif
- #ifdef FW_BUILD_WIN
- fBitmap = FW_CBitmap(resFile, 2128);
- #endif
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapContent::Externalize
- //----------------------------------------------------------------------------------------
- // ODF method
-
- void CBitmapContent::Externalize(Environment* ev,
- ODStorageUnit* storageUnit,
- FW_EStorageKinds storageKind,
- FW_CCloneInfo* cloneInfo)
- {
- // To test if fBitmap is NULL, cast it to a const void*
- if ((const void*)fBitmap != NULL)
- {
- ExternalizeBitmapShape(ev, storageUnit, fBitmap);
-
- if (storageKind != FW_kPartStorage)
- ExternalizePICTData(ev, storageUnit, fBitmap);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapContent::ExternalizeBitmapShape
- //----------------------------------------------------------------------------------------
-
- void CBitmapContent::ExternalizeBitmapShape(Environment* ev,
- ODStorageUnit* storageUnit,
- const FW_CBitmap& bitmap)
- {
- FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, fBitmapPart->GetPartKind(ev));
- FW_CWritableStream archive(suSink);
- archive << bitmap;
- }
-
- #ifdef FW_BUILD_MAC
- //---------------------------------------------------------------------------------------
- // CBitmapContent::ExternalizePICTData
- //---------------------------------------------------------------------------------------
-
- void CBitmapContent::ExternalizePICTData(Environment* ev, ODStorageUnit* destinationSU, const FW_CBitmap& bitmap)
- {
- FW_SUAddPropValue(ev, destinationSU, kODPropContents, FW_CPart::gMacPICTDataType);
-
- FW_PStorageUnitSink suSink(ev, destinationSU, kODPropContents, FW_CPart::gMacPICTDataType);
- FW_CWritableStream stream(suSink);
-
- FW_CPicture picture = bitmap.MacGetAsPicture();
-
- FW_PlatformPict platformPict = picture.GetPlatformPict();
-
- unsigned long pictSize = FW_CMemoryManager::GetSystemHandleSize((FW_PlatformHandle)platformPict);
-
- FW_CAcquireLockedSystemHandle lockedHandle((FW_PlatformHandle)platformPict);
- stream.Write(lockedHandle.GetPointer(), pictSize);
- }
- #endif
-
- //----------------------------------------------------------------------------------------
- // CBitmapContent::Internalize
- //----------------------------------------------------------------------------------------
- // ODF method
-
- FW_Boolean CBitmapContent::Internalize(Environment* ev,
- ODStorageUnit* storageUnit,
- FW_EStorageKinds storageKind,
- FW_CCloneInfo* cloneInfo)
- {
- if (storageUnit->Exists(ev, kODPropContents, fBitmapPart->GetPartKind(ev), 0))
- {
- InternalizeBitmapShape(ev, storageUnit);
- }
- #ifdef FW_BUILD_MAC
- else if (storageUnit->Exists(ev, kODPropContents, FW_CPart::gMacPICTFileType, 0))
- {
- InternalizePICTFile(ev, storageUnit);
- }
- else if (storageUnit->Exists(ev, kODPropContents, FW_CPart::gMacPICTDataType, 0))
- {
- InternalizePICTData(ev, storageUnit);
- }
- #endif
- else
- {
- FW_DEBUG_MESSAGE("CBitmapContent::InternalizeContent - Unknown type");
- return false;
- }
-
- return true;
- }
-
- //---------------------------------------------------------------------------------------
- // CBitmapContent::InternalizeBitmapShape
- //---------------------------------------------------------------------------------------
-
- void CBitmapContent::InternalizeBitmapShape(Environment* ev, ODStorageUnit* storageUnit)
- {
- FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, fBitmapPart->GetPartKind(ev));
- if (suSink->GetReadableBytes(ev) != 0)
- {
- FW_PBufferedSink sink(ev, suSink);
- FW_CReadableStream stream(sink);
- stream >> fBitmap;
- }
- }
-
- #ifdef FW_BUILD_MAC
- //---------------------------------------------------------------------------------------
- // CBitmapContent::InternalizePICTData
- //---------------------------------------------------------------------------------------
-
- void CBitmapContent::InternalizePICTData(Environment* ev, ODStorageUnit* storageUnit)
- {
- FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, FW_CPart::gMacPICTDataType);
- FW_PBufferedSink sink(ev, suSink);
- FW_CReadableStream stream(sink);
-
- unsigned long pictSize = storageUnit->GetSize(ev); //sink.GetLength();
-
- FW_CAcquireTemporarySystemHandle handle(pictSize);
-
- stream.Read(handle.GetPointer(), pictSize);
-
- MacSetBitmap(ev, (FW_PlatformPict)handle.GetPlatformHandle());
- }
- #endif
-
- #ifdef FW_BUILD_MAC
- //---------------------------------------------------------------------------------------
- // CBitmapContent::InternalizePICTFile
- //---------------------------------------------------------------------------------------
-
- void CBitmapContent::InternalizePICTFile(Environment* ev, ODStorageUnit* storageUnit)
- {
- if (storageUnit->Exists(ev, kODPropContents, FW_CPart::gMachfsDataType, 0))
- {
- storageUnit->Focus(ev, kODPropContents, kODPosUndefined, FW_CPart::gMachfsDataType, 0, kODPosUndefined);
-
- // Get the HFS flavor
- HFSFlavor hfsInfo;
-
- FW_CByteArray byteArray;
- storageUnit->GetValue(ev, sizeof(HFSFlavor), byteArray);
- byteArray.CopyBuffer(&hfsInfo, sizeof(HFSFlavor));
-
- // Use the FileSpec in HFS flavor to open the file's data fork
- FW_PFileSpecification fileSpec(ev, hfsInfo.fileSpec);
- FW_CAccessPermission permission(FW_kRead, FW_kDenyWrite);
- FW_PFile pictFile(ev, fileSpec, permission);
- FW_PFileSink pictSink(ev, pictFile);
-
- // Read the picture data from the file
- #define kPICTHeaderSize 512
- unsigned long pictSize = pictSink->GetLength(ev) - kPICTHeaderSize;
-
- FW_CAcquireTemporarySystemHandle tempHandle(pictSize);
-
- pictSink->SetPosition(ev, kPICTHeaderSize); // skip PICT file header
- pictSink->Read(ev, tempHandle.GetPointer(), pictSize);
-
- MacSetBitmap(ev, (FW_PlatformPict)tempHandle.GetPlatformHandle());
- }
- }
- #endif
-
- #ifdef FW_BUILD_MAC
- //----------------------------------------------------------------------------------------
- // CBitmapContent::MacSetBitmap
- //----------------------------------------------------------------------------------------
- // Set the bitmap from from a pict handle. The FW_PlatformPict should be deleted by the
- // caller
-
- void CBitmapContent::MacSetBitmap(Environment* ev, FW_PlatformPict picHandle)
- {
- FW_CPicture picture(picHandle); // Does not take ownership
- fBitmap = FW_CBitmap(picture);
- }
- #endif
-
- //========================================================================================
- // class CBitmapSelectionContent
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CBitmapSelectionContent::CBitmapSelectionContent
- //----------------------------------------------------------------------------------------
- // CBitmapSelectionContent constructor
-
- CBitmapSelectionContent::CBitmapSelectionContent(Environment* ev, CBitmapPart* part, CBitmapSelection* selection, CBitmapContent* bitmapContent) :
- FW_CContent(ev, part),
- fBitmapPart(part),
- fBitmapContent(bitmapContent),
- fBitmapSelection(selection)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapSelectionContent::~CBitmapSelectionContent
- //----------------------------------------------------------------------------------------
- // CBitmapSelectionContent destructor
-
- CBitmapSelectionContent::~CBitmapSelectionContent()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapSelectionContent::SelectEntireBitmap
- //----------------------------------------------------------------------------------------
-
- void CBitmapSelectionContent::SelectEntireBitmap(Environment* ev)
- {
- short width, height,rowBytes, pixelSize;
- fBitmapContent->GetBitmap(ev).GetBitmapInfo(width, height, rowBytes, pixelSize);
- FW_CPlatformRect bounds(0, 0, width, height);
- SetSelectRect(bounds);
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapSelectionContent::Internalize
- //----------------------------------------------------------------------------------------
- // ODF method
-
- FW_Boolean CBitmapSelectionContent::Internalize(Environment* ev,
- ODStorageUnit* storageUnit,
- FW_EStorageKinds storageKind,
- FW_CCloneInfo* cloneInfo)
- {
- fBitmapSelection->CloseSelection(ev);
-
- FW_Boolean result = fBitmapContent->Internalize(ev, storageUnit, storageKind, cloneInfo);
-
- if (result)
- {
- fBitmapPart->AdjustFramesSize(ev);
- fBitmapPart->PartChanged(ev);
- }
-
- return result;
- }
-
- //----------------------------------------------------------------------------------------
- // CBitmapSelectionContent::Externalize
- //----------------------------------------------------------------------------------------
- // ODF method
-
- void CBitmapSelectionContent::Externalize(Environment* ev,
- ODStorageUnit* destinationSU,
- FW_EStorageKinds storageKind,
- FW_CCloneInfo* cloneInfo)
- {
- FW_CBitmap bitmap = fBitmapContent->GetBitmap(ev).Copy(fSelectRect);
-
- fBitmapContent->ExternalizeBitmapShape(ev, destinationSU, bitmap);
-
- if (storageKind != FW_kPartStorage)
- fBitmapContent->ExternalizePICTData(ev, destinationSU, bitmap);
- }
-
- //---------------------------------------------------------------------------------------
- // CBitmapSelectionContent::CreateDataFrameShape
- //---------------------------------------------------------------------------------------
- // Return the shape of the selected data. This will be added to the clipboard or
- // drag and drop storage unit.
-
- ODShape* CBitmapSelectionContent::CreateDataFrameShape(Environment* ev) const
- {
- ODShape* shape = NULL;
-
- // ----- we don't use the zoom factor -----
- FW_CRect rect(fSelectRect);
- if (rect != FW_kZeroRect)
- {
- rect.Offset(-rect.left, -rect.top);
- shape = ::FW_NewODShape(ev, rect);
- }
-
- return shape;
- }
-
-